Linux 您所在的位置:网站首页 linux 更换驱动 Linux

Linux

2024-07-12 03:05| 来源: 网络整理| 查看: 265

Linux 内核编译完成以后会在 arch/arm/boot 目录下生成 zImage 镜像文件,如果使用设备树的话还会在 arch/arm/boot/dts 目录下开发板对应的 .dtb( 设备树 ) 文件,比如 imx6ull-14x14-evk.dtb 就是 NXP 官方的 I.MX6ULL EVK 开发板对应的设备树文件。至此我们得到两个文件: ①、 Linux 内核镜像文件: zImage 。 ②、 NXP 官方 I.MX6ULL EVK 开发板对应的设备树文件: imx6ull-14x14-evk.dtb 。 3、启动测试

将编译出来的zImage和imx6ull-14x14-evk.dtb复制到Ubuntu中的tftp目录下,之后会通过uboot 的tftp命令将其下载到开发板中。

在测试之前确保uboot中的环境变量bootargs内容如下(在UBOOT命令模式下使用print指令查看):

console=ttymxc0,115200 root=/dev/mmcblk1p2 rootwait rw

如果不是的话,可以使用如下指令设置一下:

setenv bootargs 'console=ttymxc0,115200 root=/dev/mmcblk1p2 rootwait rw' saveenv

然后可以测试了,启动开发板,串口中进入uboot命令行模式,然后输入如下命令将zImage和imx6ull-14x14-evk.dtb下载到开发板中并启动:

tftp 80800000 zImage tftp 83000000 imx6ull-14x14-evk.dtb bootz 80800000 - 83000000

可以看到内核启动了

4、根文件系统缺失的错误

Linux内核启动以后是需要根文件系统的,根文件系统存在哪里是由uboot的bootargs环境变量指定, bootargs会传递给Linux内核作为命令行参数 。 比如之前设置的root=/dev/mmcblk1p2,也就是说根文件系统存储在/dev/mmcblk1p2中,即EMMC的分区2中。

因为上一篇的测试时,EMMC的分区2中烧写好了根文件系统,所以设置root=/dev/mmcblk1p2,并且内核正常启动。如果我们不设置根文件系统路径,或者说根文件系统路径设置错误的话会出现什么问题?

这个问题是很常见的,我们在实际的工作中开发一个产品,这个产品的第一版硬件出来以后我们是没有对应的根文件系统可用的,必须要自己做根文件系统。

我们将uboot中的bootargs环境变量改为“console=ttymxc0,115200” ,也就是不填写root的内容了,命令如下:

setenv bootargs 'console=ttymxc0,115200' saveenv

修改完成以后重新从网络启动,可以看到也是先启动了内核:

但启动以后会有类似如下的错误:

最后会有下面这一行:

Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0)

提示内核崩溃,因为VFS(虚拟文件系统)不能挂载根文件系统,目录不存在。即使目录存在,如果根文件系统目录里面是空的依旧会提示内核崩溃。这个就是根文件系统缺失导致的内核崩溃,但是内核是启动了的,只是根文件系统不存在而已。

二、在Linux中添加自己的开发板

在上一节中我们通过编译 NXP 官方 I.MX6ULL EVK 开发板对应的 Linux 内核,发现其可以在正点原子的 EMMC 版本开发板启动,所以我们就参考 I.MX6ULL EVK 开发板的设置,在 Linux 内核中添加正点原子的 I.MX6U-ALPHA 开发板。

1 参照官方配置文件添加开发板默认配置文件

将arch/arm/configs目录下的imx_v7_mfg_defconfig重新复制一份 , 命名为自己开发板,如imx_myboard_defconfig。

之后配置此开发板的内核命令就可以是:

make imx_myboard_defconfig 2 添加开发板对应的设备树文件

进入arch/arm/boot/dts目录中,复制一份imx6ull-14x14-evk.dts,然后将其重命名为imx6ull-myboard.dts。

然后还需要修改文件arch/arm/boot/dts/Makefile,找到 dtb-$(CONFIG_SOC_IMX6ULL)配置项,在此配置项中加入“imx6ull-myboard.dtb” :

这样编译Linux的时候就可以从imx6ull-myboard.dts 编译出 imx6ull-myboard.dtb 文件了。

总结一下以上的修改主要包括:

主要就是对文件复制一份并重命名,(配置文件中可能还需修改,比如说屏蔽掉“CONFIG_ARCH_MULTI_V6=y”这一行,这一行是V6架构的相关选项),还要修改Makefile文件,添加设备树配置。

三、编译测试

新建一个build_myboard.sh,写入如下内容:

#!/bin/sh make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- imx_myboard_defconfig make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- all -j8 第 2 行,清理工程。 第 3 行,使用默认配置文件 来配置 Linux 内核。 第 4 行,打开 Linux 的图形配置界面,如果不需要每次都打开图形配置界面可以删除此行。 第 5 行,编译 Linux 。 执行 shell 脚本build_myboard.sh 编译 Linux 内核,命令如下: chmod 777 build_myboard.sh //给予可执行权限 ./build_myboard.sh //执行 shell 脚本编译内核 编译完成以后就会在目录 arch/arm/boot 下生成 zImage 镜像文件。在 arch/arm/boot/dts 目录 下生成 imx6ull-myboard.dtb 文件。将这两个文件拷贝到 tftp 目录下,然后重启开发板,在uboot 命令模式中使用 tftp 命令下载这两个文件并启动,命令如下: tftp 80800000 zImage tftp 83000000 imx6ull-myboard.dtb bootz 80800000 – 83000000 四、CPU主频和网络驱动修改

修改驱动之前,要先保证板子能正常启动,所以表明根文件系统也要处理好,此时自己的根文件系统还没移植,所以在这先使用emmc中现成的根文件系统。

开始设置bootcmd、bootargs环境变量,bootcmd设置默认从网络启动

Setenv  bootcmd   'tftp 80800000 zImage;tftp 83000000 imx6ull-myboard.dtb ;bootz 80800000 – 83000000;'

setenv bootargs 'console= ttymxc0, 115200 root= /dev/mmcblk1p2 rootwait rw'

在这里可能自己的emmc的驱动会有问题,需要先照着原板设备树节点修改自己的设备树。

一)EMMC驱动修改 1 、使能 8 线 EMMC 驱动

正点原子 EMMC 版本核心板上的 EMMC 采用的 8 位数据线,Linux 内核驱动里面 EMMC 默认是 4 线模式的,4 线模式肯定没有 8 线模式的速度快,所以我们将 EMMC 的驱动修改为 8 线模式。修改方法很简单,直接修改设备树即可,打开文件 imx6ull-myboard.dtb,把emmc设备节点更换成原厂的8bit的。

2 、关闭 EMMC 1.8V 供电选项 此时 EMMC 工作电压是 3.3V 的,因此我们要在emmc设备节点中添加“ no-1-8-v”选项, 也就是关闭 1.8V 这个功能选项。防止内核在 运行的时候用 1.8V 去驱动 EMMC ,导致 EMMC 驱动出现问题 二)CPU主频修改 设置 I.MX6U-ALPHA 开发板工作在 792MHz 可以在内核图形化界面配置, 进入如下路径: CPU Power Management -> CPU Frequency scaling -> Default CPUFreq governor 选择“ performance”即可,选择以后退出图形化配置界面,然后编译 Linux内核,一定不要清理工程!否则的话我们刚刚的设置就会被清理掉。编译完成以后使用新的Image 重启 Linux,查看当前 CPU 的工作频率和调频策略。我们学习的时候为了高性能,大家可以使用 performance 模式。但是在以后的实际产品开发中,从省电的角度考虑,建议大家使用 ondemand 模式,一来可以省电,二来可以减少发热。 三)网络驱动修改 正点原子开发板的网络和 NXP 官方的网络硬件上 不同,网络 PHY 芯片由 KSZ8081 换为了 LAN8720A ,两个网络 PHY 芯片的复位 IO 也不同。 所以 Linux 内核自带的网络驱动是驱动不起来 I.MX6U-ALPHA 开发板上的网络的,需要做修改。 1 、修改 LAN8720 的复位以及网络时钟引脚驱动 2 、修改 设备树中 fec1 和 fec2 节点的 pinctrl-0 属性 3 、修改设备树中  LAN8720A 的 PHY 地址 4、 修改 fec_main.c 文件         要 在 I.MX6ULL 上使用 LAN8720A , 需 要 修 改 一 下 Linux 内 核 源 码 5、图形化 配置 Linux 内核,使能 LAN8720 驱动 6 、网络驱动测试 修改好设备树和 Linux 内核以后重新编译一下,得到新的 zImage 镜像文件和 设备树文件,使用网线将 I.MX6U-ALPHA 开发板的两个网口与路由器或者电脑连接起来,最后使用新的文件启动 Linux 内核。启动以后使用“ ifconfig ”命令查看一下当前活动的网卡有哪些。 总结: 关于 Linux 内核的移植就讲解到这里,简单总结一下移植步骤: ①、在 Linux 内核中查找可以参考的板子,一般都是半导体厂商自己做的开发板。 ②、编译出参考板子对应的 zImage 和 .dtb 文件。 ③、使用参考板子的 zImage 文件和 .dtb 文件在我们所使用的板子上启动 Linux 内核,看能否启动。 ④、如果能启动的话就万事大吉,如果不能启动那就悲剧了,需要调试 Linux 内核。不过一般都会参考半导体官方的开发板设计自己的硬件,所以大部分情况下都会启动起来。启动Linux 内核用到的外设不多,一般就 DRAM(Uboot 都初始化好的 ) 和串口。作为终端使用的串口一般都会参考半导体厂商的 Demo 板。 ⑤、修改相应的驱动,像 NAND Flash 、 EMMC 、 SD 卡等驱动官方的 Linux 内核都是已经提供好了,基本不会出问题。重点是网络驱动,因为 Linux 驱动开发一般都要通过网络调试代码,所以一定要确保网络驱动工作正常。如果是处理器内部 MAC+ 外部 PHY 这种网络方案的话,一般网络驱动都很好处理,因为在 Linux 内核中是有外部 PHY 通用驱动的。只要设置好复位引脚、PHY 地址信息基本上都可以驱动起来。 ⑥、 Linux 内核启动以后需要根文件系统,如果没有根文件系统的话肯定会崩溃,所以确定 Linux 内核移植成功以后就要开始根文件系统的构建。

资料来源:i.MX6ULL嵌入式Linux开发3-Kernel移植 - 知乎 

资料来源:开源电子网



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有